Вход

Просмотр полной версии : JavaScript копирование значение и введение в дргой селектор


Pro808
10.01.2014, 13:20
Кто подскажет код ... При нажатие на якокрь <a></a> с определенным ID появлялось окно prompt и при введение в него значение ( цифры ) , оно( значение ) записывалось в таблицу tbody tr td .
1.Введение значения
2.Сохранение значения
3.Замена значения в таблице на введенное
Можно реализовать , даже если не через prompt ?

Заранее благодарен !

kostyanet
11.01.2014, 04:17
Сделайте таблицу editable и не парьтесь.

Pro808
11.01.2014, 20:03
Спасибо за идею , но содержимое после обновления страницы не сохраняется. Можно ли это как-нибудь исправить ?

Pro808
12.01.2014, 00:09
<div id="content">

<script type="text/javascript">

function change()
{

var number_1 = document.getElementsByClassName('number')[0].innerHTML; // Получаем Содержимое селектора

var number = prompt("Введите значение"); // number получает значение от пользователя

number_1.replace(number_1 , number); // Должен изменить

}

</script>

<table border="1">
<thead>

<tr>

<td class="number" onclick="change()">Этот текст поменять на другой текст</td>

</tr>

</thead>
</table>


</div>




Пришел к этому варианту. Что не так ?

kostyanet
14.01.2014, 03:52
но содержимое после обновления страницы не сохраняется

В js ничего не сохраняется после обновления страницы. Кроме того, что записано клиенту на диск. Вот и запишите ему туда всю таблицу. Можно как есть, с разметкой, чтобы не рендерить еще раз.

kostyanet
14.01.2014, 04:02
Короче, editable элементы не генерят событий, отчего юзать их можно только тотально. То есть навалом сохранять все введенное барахло не различая изменений или вычислять их сравнением.

Поэтому нарисуйте 1 input type="text" style="display:none;", и повесьте на всю таблицу (с tabindex обязательно!) событие click на которое сделайте callback. Событие поступившее в функцию даст вам элемент - ячейку. Из нее вы узнаете координаты ячейки и сможете подогнать input к щелкнутой ячейке и заменить ему elem.style.display="" в результате чего в ячейке кагбэ появится поле ввода. На это поле повесьте событие blur и функцию на него которая сохранит введенное значение.

Это типичная фича всех datagrid.

рони
14.01.2014, 05:27
:write:
<!DOCTYPE HTML>
<html>

<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
td{
border: #FF0000 1px solid
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
<script>
$.fn.setCursorPosition = function(pos) {
this.each(function(index, elem) {elem.focus();
if (elem.setSelectionRange) {
elem.setSelectionRange(pos, pos);
} else if (elem.createTextRange) {
var range = elem.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
});
return this;
};
$(document)
.ready(function () {
var tds = JSON.parse(localStorage.getItem("tds")) || {};
var td = document.querySelectorAll("td");
Object.keys(tds).forEach(function f(i) {
td[i] && (td[i].innerHTML = tds[i])
});
$("td")
.click(function () {
var td = $(this),
text = td.html(),
$indx = $("td").index(td),
varX = $("<input/>", {
"value": text,
"click": function (event) {
event.stopPropagation()
},
"blur": function () {
tds[$indx] = $(this).val();
localStorage.setItem("tds", JSON.stringify(tds));
td.html($(this).val())

}
});


td.html(varX);
varX.setCursorPosition(text.length)
});
});
</script>
</head>

<body>
<table>
<tr>
<td>1234</td>
<td>1234</td>
</tr>
<tr>
<td>1234</td>
<td>1234</td>
</tr>
<tr>
<td>1234</td>
<td>1234</td>
</tr>
</table>
</body>
</html>

kostyanet
14.01.2014, 05:49
xml сосет одним словом.

Pro808
14.01.2014, 16:35
Спасибо kostyanet за советы ! рони спасибо за готовый код ! :thanks:

Карма Level UP ! :yes:

kostyanet
14.01.2014, 18:56
Поначалу я тоже было повесил события на каждую строку, но строк оказалось может быть несколько килоштук, поэтому пришлось сообразить повесить ровно 1 на всю таблицу и получать ссылку на ячейку через объект Event. В приложенной выше скриптографии как я понимаю они вешаются на каждый cell. То есть таблица заведомо не должна быть очень большой.

рони
14.01.2014, 19:18
повесить ровно 1 на всю таблицу
специально для вас в скриптографии клик на table,как вариант table можно заменить на любой вышестоящий тег
<!DOCTYPE HTML>
<html>

<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
td{
border: #FF0000 1px solid
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
<script>
$.fn.setCursorPosition = function (b) {
this.each(function (c, a) {
a.focus();
if (a.setSelectionRange) a.setSelectionRange(b, b);
else if (a.createTextRange) {
var d = a.createTextRange();
d.collapse(!0);
d.moveEnd("character", b);
d.moveStart("character", b);
d.select()
}
});
return this
};
$(document).ready(function () {
var b = JSON.parse(localStorage.getItem("tds")) || {},
c = document.querySelectorAll("td"),
a;
for (a in b) c[a] && (c[a].innerHTML = b[a]);
$("table").on("click", "td", function () {
var a = $(this),
c = a.html(),
e = $("td").index(a),
f = $("<input/>", {
value: c,
click: function (a) {
a.stopPropagation()
},
blur: function () {
b[e] = this.value;
localStorage.setItem("tds", JSON.stringify(b));
a.html(b[e])
}
});
a.html(f);
f.setCursorPosition(c.length)
})
});
</script>
</head>

<body>
<table>
<tr>
<td>1234</td>
<td>1234</td>
</tr>
<tr>
<td>1234</td>
<td>1234</td>
</tr>
<tr>
<td>1234</td>
<td>1234</td>
</tr>
</table>
<table>
<tr>
<td>1234</td>
<td>1234</td>
</tr>
<tr>
<td>1234</td>
<td>1234</td>
</tr>
<tr>
<td>1234</td>
<td>1234</td>
</tr>
</table>
</body>
</html>

kostyanet
14.01.2014, 19:46
Я об этом крипто:

$("table").on("click", "td", function () {

если расшифровать то будет td.addEventListener(); или не будет?

рони
14.01.2014, 20:26
не будет?
будет клик по таблице анализироватся на наличие ячейки td в event.target обычное делегирование

Pro808
14.01.2014, 20:32
Скрипт очень хорош , при изменение значения всё происходит как надо , но сохраняется первый потомок. Можно сделать скрипт для неограниченного количества потомков ?

рони
14.01.2014, 20:39
но сохраняется первый потомок. Можно сделать скрипт для неограниченного количества потомков ?
можно на пальцах про потомков?

Pro808
14.01.2014, 20:43
Да ...


<tbody>

//Первый <td></td>
// второй <td></td>

</tbody>

... и так далее по счету

рони
14.01.2014, 20:48
Pro808,
скрипт сохраняет изменения для любой ячейки какая бы она ни была по счёту и общее количество ячеек также любое в пределах localStorage

Pro808
14.01.2014, 20:50
P.S. загрузил на локалку , заполнил то что было нужно , но в итоге сохранился первый столбец , первые потомки .

рони
14.01.2014, 20:53
Pro808,
структуру вашей таблицы покажите?
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:


... ваш код...



О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

рони
14.01.2014, 20:54
Pro808,
здесь таблица 2 столбца -- здесь как сохраняет?

Pro808
14.01.2014, 21:02
http://script-help.hol.es/


Можно проверить , а затем можно скачать страничку и убедиться в том что сохранился столбец только под номером "1"

рони
14.01.2014, 21:09
Pro808, посмотрите где и в какой последовательности находятся скрипты
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Как сделать</title>

<style type="text/css">

.help table
{
height: 400px;
width: 800px;
}

.help table thead th
{
height: 49px;
font-size: 18px;
text-align: center;
border: 1px solid #141414;
border-left: none;
}

.help table thead th:first-child
{
border-left: 1px solid #141414;
}

.help table thead th:nth-child(2)
{
color: #3B3B3B;
}
.help table thead th:nth-child(3)
{
color: #038703;
}
.help table thead th:nth-child(4)
{
color: #E59A16;
}
.help table thead th:last-child
{
color: red;
}

.help table tbody td
{
font-weight: bold;
height: 40px;
font-size: 18px;
text-align: center;
border: 1px solid #141414;
border-left: none;
border-top: none;
}

.help table tbody td:first-child
{
border-left: 1px solid #141414;
}
.help table tbody td:nth-child(2)
{
color: #3B3B3B;
}
.help table tbody td:nth-child(3)
{
color: #038703;
}
.help table tbody td:nth-child(4)
{
color: #E59A16;
}
.help table tbody td:last-child
{
color: red;
}

</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
<script type="text/javascript">

$.fn.setCursorPosition = function(pos) {
this.each(function(index, elem) {elem.focus();
if (elem.setSelectionRange) {
elem.setSelectionRange(pos, pos);
} else if (elem.createTextRange) {
var range = elem.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
});
return this;
};
$(document)
.ready(function () {
var tds = JSON.parse(localStorage.getItem("tds")) || {};
var td = document.querySelectorAll("td");
Object.keys(tds).forEach(function f(i) {
td[i] && (td[i].innerHTML = tds[i])
});
$("td")
.click(function () {
var td = $(this),
text = td.html(),
$indx = $("td").index(td),
varX = $("<input/>", {
"value": text,
"click": function (event) {
event.stopPropagation()
},
"blur": function () {
tds[$indx] = $(this).val();
localStorage.setItem("tds", JSON.stringify(tds));
td.html($(this).val())

}
});


td.html(varX);
varX.setCursorPosition(text.length)
});
});
</script>

</head>
<body>

<div class="help">

<table cellspacing="0" >
<thead>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
</tr>
</thead>
<tbody>
<tr> <td></td> <td></td> <td></td> <td></td> <td></td> </tr>
<tr> <td></td> <td></td> <td></td> <td></td> <td></td> </tr>
<tr> <td></td> <td></td> <td></td> <td></td> <td></td> </tr>
</tbody>
</table>
</div>
</body>
</html>

Pro808
14.01.2014, 21:10
Вроде всё.

Pro808
14.01.2014, 21:18
http://fscreen.ru/Y23cXg14114211633

Скриншот после перезагрузки страниц. ( на компьютере и на винде XP (справа))

Скачал файл через cpanel , в итоге всё пусто , делается куки по-моему .

рони
14.01.2014, 21:28
Скачал файл через cpanel , в итоге всё пусто , делается куки по-моему .
моя твоя непонимай -- если нужно стереть
записанное запустите на странице один раз
<script>
localStorage.setItem("tds", null);
</script>

Pro808
14.01.2014, 21:39
Нет в том то и дело что нечего не сохраняется на сервер , скачал файл с сервера он пустой , а мне нужно с сохранение введенных данных.

На предыдущей пикче , слева я ввел данные , справа я зашел на локальный компьютер и там нет ничего в таблице , нечего не сохранилось ...

рони
14.01.2014, 22:18
нечего не сохраняется на сервер
а где вы увидели в коде что-либо для сохранения на сервере ??? отправляйте данные изменённые на сервер

ОлегА
15.01.2014, 08:01
зашел на локальный компьютер и там нет ничего в таблице
Чудес не бывает, тут надо только аяксом посылать данные на сервер.

Pro808
15.01.2014, 21:00
ОлегА, Поможешь ?

ОлегА
16.01.2014, 15:31
Pro808, пишите в личку.